using UniversalAdminSystem.Domian.Core.Interfaces;
using UniversalAdminSystem.Domian.PermissionManagement.Aggregate;

namespace UniversalAdminSystem.Domian.PermissionManagement.IRepository;

/// <summary>
/// 角色仓储接口
/// 提供角色数据的持久化操作
/// </summary>
public interface IRoleRepository : IRepository<Role>
{   
    /// <summary>
    /// 根据角色名称查找角色
    /// </summary>
    /// <param name="roleName">角色名称</param>
    /// <returns>角色实体，如果不存在则返回null</returns>
    Task<Role?> GetByNameAsync(string roleName);

    /// <summary>
    /// 根据角色ID集合获取角色列表
    /// </summary>
    /// <param name="roleIds">角色ID集合</param>
    /// <returns>角色集合</returns>
    Task<IEnumerable<Role>> GetByIdsAsync(IEnumerable<Guid> roleIds);
    
    /// <summary>
    /// 查询角色下的所有权限ID
    /// </summary>
    /// <param name="roleId">角色ID</param>
    /// <returns>权限ID集合</returns>
    Task<IReadOnlyCollection<Guid>> GetPermissionIdsAsync(Guid roleId);

    /// <summary>
    /// 根据角色名称判断角色是否存在
    /// </summary>
    /// <param name="roleName">角色名称</param>
    /// <returns>角色是否存在</returns>
    Task<bool> ExistsAsync(string roleName);

    /// <summary>
    /// 获取角色及其权限（包含权限导航属性）
    /// </summary>
    /// <param name="roleId">角色ID</param>
    /// <returns>角色实体，如果不存在则返回null</returns>
    Task<Role?> GetRoleWithPermissionsAsync(Guid roleId);

    /// <summary>
    /// 获取所有角色及其权限
    /// </summary>
    /// <returns>角色集合</returns>
    Task<IEnumerable<Role>> GetAllRolesWithPermissionsAsync();
}